#!/bin/bash
# 文件名：get_root_partition_uuid.sh
# 功能说明：
# 本脚本用于获取当前根文件系统 (/) 的 UUID，并提供多种不同的实现方式，以确保兼容性。
#
# 实现方式：
# 1. 使用 awk 和 sed
# 2. 使用 grep 和 cut
# 3. 使用 awk 和 perl
# 4. 使用 sed 和 awk
# 5. 通过 /dev/disk/by-uuid 目录解析 UUID
# 6. 通过 df 命令获取设备再查询 UUID
#
# 兼容性：
# - 适用于大多数 GNU/Linux 发行版
# - 依赖于 blkid、grep、awk、sed、perl、df 等命令
# - 需要 root 权限以使用 blkid 解析 UUID
#
# 使用方法：
# 直接运行脚本，它将依次测试所有方法并输出 UUID：
#   ./get_root_partition_uuid.sh
#
# 退出状态：
# - 0: 成功执行
# - 1: 未能找到 UUID
#
# 说明：
# - 当脚本被执行时，会依次调用不同方法获取 UUID，并以彩色格式显示每种方法的结果。

# 方法一：使用 awk 和 sed
get_uuid_with_awk_and_sed() {
  local dev
  dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)"
  uuid=$(sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p')
  echo "$uuid"
}

# 方法二：使用 grep 和 cut
get_uuid_with_grep_and_cut() {
  local dev
  dev="$(grep ' / ' /proc/mounts | cut -d' ' -f1)"
  uuid=$(sudo blkid -o export -- "$dev" | grep '^UUID=' | cut -d'=' -f2)
  echo "$uuid"
}

# 方法三：使用 awk 和 perl
get_uuid_with_awk_and_perl() {
  local dev
  dev="$(awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)"
  uuid=$(sudo blkid -o export -- "$dev" | perl -ne 'print $1 if /^UUID=(.*)$/')
  echo "$uuid"
}

# 方法四：使用 sed 和 awk
get_uuid_with_sed_and_awk() {
  local dev
  dev="$(sed -n 's|^\([^ ]*\) / .*|\1|p' /proc/mounts)"
  uuid=$(sudo blkid -o export -- "$dev" | awk -F= '/^UUID=/ {print $2}')
  echo "$uuid"
}

# 方法五：通过 /dev/disk/by-uuid 查找当前挂载分区
get_uuid_with_by_uuid_directory() {
  local mountpoint="/"
  local dev
  # 获取当前挂载点的设备名称
  dev=$(grep " $mountpoint " /proc/mounts | cut -d' ' -f1)
  # 查找并返回挂载设备的 UUID
  uuid=$(ls -l /dev/disk/by-uuid/ | grep "$(basename "$dev")" | awk '{print $9}')
  echo "$uuid"
}

# 方法六：通过 df 命令
get_uuid_with_df() {
  local dev
  dev=$(df / | tail -1 | awk '{print $1}')
  uuid=$(sudo blkid -o export -- "$dev" | sed -n 's/^UUID=//p')
  echo "$uuid"
}

# 定义颜色代码
BLUE="\e[34m"    # 蓝色用于标题
RESET="\e[0m"    # 颜色重置

# 主函数，执行所有方法并显示结果
main() {
  echo -e "${BLUE}Testing method: awk and sed${RESET}"
  get_uuid_with_awk_and_sed

  echo -e "${BLUE}Testing method: grep and cut${RESET}"
  get_uuid_with_grep_and_cut

  echo -e "${BLUE}Testing method: awk and perl${RESET}"
  get_uuid_with_awk_and_perl

  echo -e "${BLUE}Testing method: sed and awk${RESET}"
  get_uuid_with_sed_and_awk

  echo -e "${BLUE}Testing method: /dev/disk/by-uuid directory${RESET}"
  get_uuid_with_by_uuid_directory

  echo -e "${BLUE}Testing method: df command${RESET}"
  get_uuid_with_df
}

# 调用主函数
main
